Skip to main content
Version: 1.7.0

TACO 应用开发入门

一、前言

1.1 TACO SDK 简介

TACO SDK 是特普斯微面向 EA65 系列 AI SoC 定制的软件开发包,为深度学习应用开发和部署提供了高效、易用的解决方案。

其主要功能模块包括:

  • 深度学习工具链: 用于移植和优化神经网络模型。
  • 软件开发接口库: 提供网络模型在板载 NPU 上进行推理所需的核心 API。
  • 媒体开发库: 包含拉流推流、音视频编解码、视频处理等功能的库及示例代码。

1.2 TACO AI 开发框架简介

TACO AI 开发框架包括核心推理引擎 taRuntime、taOpenCV、taFFmpeg、taCV、taOpenBLAS、NN 工具链等,其基本架构如下图所示:

1.3 SDK 获取

TACO SDK 需要配合特普斯微官方发布的 EM20-DK (或 EA65 系列其他产品如 AIBOX)使用,本文例程以 EM20-DK 开发板为基准。

二、开发环境搭建

本章节指导用户在主机上搭建交叉编译板载应用软件的SDK开发环境及板端运行环境的配置。

2.1 主机环境配置 (Docker)

用户需要一台 x86 主机来安装 SDK 和配置开发环境。我们强烈建议使用 Docker 来保证编译环境的一致性,简化环境配置过程。

  • 硬件推荐
    • 若主要用于模型编译、量化等任务,推荐内存 >= 8GB。
    • 若主要用于交叉编译应用,主流 PC 即可满足要求。
  • 操作系统
    • Ubuntu 20.04 或更高版本。

主机环境配置步骤如下:

  1. 安装依赖工具

    打开终端,执行以下命令安装 Git, Docker 等必要工具。

    sudo apt-get update
    sudo apt install -y git git-lfs docker.io wget unzip parted fdisk util-linux e2fsprogs dosfstools
  2. 获取 TACO SDK

  3. 启动 Docker 编译环境

    进入解压后的 tps-future 目录,执行 start_workshop_docker.sh 脚本来启动并进入预配置好的 Docker 容器。

    ./start_workshop_docker.sh

    成功后,用户将进入 Docker 容器的 tps-future 目录,后续的编译操作都将在此环境中进行。

2.2 开发板环境配置

  1. 登录开发板

    EM20-DK 开发板上电后,通过串口(波特率 115200)或 SSH 登录(用户名/密码: root/root)。

  2. 安装板载业务包

    EM20-DK 开发板默认是最小系统,需确认已安装 taco-sdk 业务包以创建SDK应用运行环境、获取最新的库和驱动。

    sudo apt update
    sudo apt install tps-firmware taco-sdk
  3. 验证驱动加载

    执行 lsmod 命令,确保 vipcore 驱动已成功加载,如下所示:

    root@taco-dk:~# lsmod
    Module Size Used by
    vipcore 352256 0
  4. 验证版本信息

    为了确保开发环境与文档一致,避免因版本错乱导致未知问题,请在开发板上执行以下命令查看 SDK 环境版本信息:

    tps-smi

    输出:

    Fri Jul 31 10:45:57 2026
    +-----------------------------------------------------------------------------+
    | TPS SMI: 1.7.0 Firmware Version: 1.7.0 TACO Version: 2.0.0 |
    +---------------------------------------+-------------------------------------+
    | NPU-SOM SoC-Name |CPU-CurClk CPU-Usage Mem-Usage | SOM-Current SOM-Pwr |
    |Fan ChipTemp SOM-Temp |NPU-Usage0 NPU-Usage1 NPU-Clk | SOM-SN |
    +---------------------------------------+-------------------------------------+
    | - TOPSFuture EA6530|1584MHz 0% 29% | 90mA 0mW |
    |1495 27°C 26°C| 0% 0% N/A | EM04CSC1A1 |
    +---------------------------------------+-------------------------------------+

    请核对输出的版本号,确保其符合用户项目所要求的版本。

三、AI 应用示例

3.1 Hello, TACO:运行第一个 AI 应用

本章节将以官方示例 mot(Multiple Object Tracking) 为例,带用户走通 PC 编译 -> 板载运行 -> 结果呈现 的完整开发闭环。

3.1.1 编译示例程序 (在 Docker 中)

请确保用户已根据 「TACO 应用开发入门」文档的「主机环境配置」章节 的指引进入了 Docker 容器的 bash 终端。

  1. 进入示例代码目录

    cd /tps-future/ta-vsp/ta-samples/mot
  2. 创建并进入 build 目录

    cd simple_demo
    mkdir build && cd build
  3. 使用 cmake 配置工程

    cmake .. && make

编译成功后,可执行文件 simple_demo 会生成在 simple_demo/build/ 目录下。

3.1.2 部署与运行 (在开发板上)

  1. 拷贝文件 用户可以使用 scp 命令来完成以下操作。

    • 将主机 Docker 容器内的可执行文件 (示例程序路径为 /tps-future/ta-vsp/ta-samples/mot/simple_demo/build/) 复制到开发板的任意位置(例如 /root)。

    • config.json(示例程序路径为 /tps-future/ta-vsp/ta-samples/mot/configs/config.json) 文件复制到开发板的任意位置(例如 /root)。

    • 将模型文件 (示例程序路径为 /tps-future/ta-vsp/ta-samples/mot/models/) 复制到开发板的任意位置(例如 /root)。

    • 用户可以将自己的视频文件复制到开发板的任意位置(例如 /root)。

    💡 提示:

    • 模型文件路径和数据文件路径,请根据实际情况修改,和config.json保持一致即可。
    • config.json中可以配置使用ffmpeg或者opencv进行视频处理。
  2. 运行程序

    在开发板的终端中,进入用户拷贝的 build 目录,并运行程序。


    # 运行程序,以本地视频文件为例
    ./simple_demo ./config.json

    💡 提示:

    • 不带参数运行 ./simple_demo 将会显示用法说明。

3.1.3 查看结果 (视频文件)

程序成功运行后,会按照 config.jsonoutput_path 配置生成推理结果视频。 若配置 "output_path": "output.mp4",则输出文件为 output.mp4,文件内包含 AI 目标检测标注,可将该视频文件拷贝至主机进行播放查看效果。

3.1.4 退出程序

程序一旦运行,视频帧未全部解码完成时只能通过强制关闭,来实现退出程序的效果。

  • 强制关闭

    📝 注意:

    • 用户可以手动执行 CTRL + C ,强制关闭此程序。
    • 关闭过程中出现 [error] Error sending a packet for decoding 这种错误提示,属于正常行为,可以忽略。
  • 程序打印

    📝 注意:

    • 运行过程中,程序可能会存在错误打印,可能是执行了硬件不支持的功能(如图像放大操作),失败后会自动使用CPU实现。

3.2 应用案例讲解:mot(Multiple Object Tracking)

本节将基于 mot 案例,解析其内部实现,帮助用户理解 TACO 应用开发的核心流程。

3.2.1 程序流程概览

该示例整合了 TACO SDK 的主要模块,实现了一个完整的 AI 处理链路:

mot

3.2.2 核心 API 解析

以下是实现上述流程的关键代码片段和 API 解析。

3.2.2.1 加载模型

使用 ta_runtime_load_model_from_file 函数从 .nb 文件加载预编译的 AI 模型到 NPU。

// 最后一个参数 0 表示使用 NPU 的第一个核心
int status = ta_runtime_load_model_from_file(&m_nnrt_context, file_path.c_str(), 0);
3.2.2.2 硬件加速解码

通过 avcodec_find_decoder_by_name 指定使用硬件加速解码器 (h264_tacohevc_taco)。

if (video_stream->codecpar->codec_id == AV_CODEC_ID_H264) {
codec = avcodec_find_decoder_by_name("h264_taco");
}
if (video_stream->codecpar->codec_id == AV_CODEC_ID_HEVC) {
codec = avcodec_find_decoder_by_name("hevc_taco");
}
3.2.2.3 图像尺寸调整 (Resize)

调用 ta_cv_image_resize 接口,使用硬件对解码后的图像进行高效缩放,以满足模型输入尺寸要求。

ta_cv_resize_image_t resize_attr = {0};
ta_cv_resize_t resize = {0};
resize.in_height = srch; // 源图高度
resize.in_width = srcw; // 源图宽度
resize.out_height = dsth; // 目标高度
resize.out_width = dstw; // 目标宽度
// ... 其他参数设置
resize_attr.resize_img_attr = &resize;
ret = ta_cv_image_resize(&resize_attr, image_in, image_out);
3.2.2.4 NPU 推理

通过 ta_runtime_set_input_pha 设置模型输入数据的物理地址,然后调用 ta_runtime_run_network 触发 NPU 进行一次推理。

taconn_input_phy_t input[2];
// 设置 NV12 格式图像的 Y 和 UV 分量的物理地址和大小
input[0].physical_table[0] = phyaddr;
input[0].size_table[0] = srcw * srch;
input[1].physical_table[0] = phyaddr + srcw * srch;
input[1].size_table[0] = srcw * srch / 2;

// 设置输入并运行推理
ret = ta_runtime_set_input_pha(&m_nnrt_context, m_input_num, input);
ret = ta_runtime_run_network(&m_nnrt_context);
3.2.2.5 后处理

对 NPU 输出的原始数据进行解析,获取目标的类别、置信度和坐标,并进行坐标转换。

objects[i] = proposals[picked[i]];
// 获取检测目标的原始坐标
float x0 = objects[i].box.left;
float y0 = objects[i].box.top;
// ...
// 对坐标进行缩放和边界处理
x0 = std::max(std::min(x0, (float)letterbox_cols), 0.f);
y0 = std::max(std::min(y0, (float)letterbox_rows), 0.f);
// ...
// 更新检测目标的最终坐标
objects[i].box.left = x0;
// objects[i].class_id; // 获取检测类别
// objects[i].prob; // 获取置信度
3.2.2.6 硬件编码

将带有标注框的图像, 通过 avcodec_find_encoder_by_name 指定使用硬件加速解码器 (jpeg_taco ), 进行硬件 JPEG 编码,准备用于推流。

mjpeg_codec = avcodec_find_encoder_by_name("jpeg_taco");

TACO SDK 的主要模块详情请查阅 「TACO 应用开发技术手册」 中的相关内容。

四、多媒体应用示例

在 PC 端打开下载镜像中的 ta-workshop-xxx 文件夹中的 tps-future 文件,执行 ./start_workshop_docker.sh 进入docker镜像中进行编译。

mot 为例:

  1. 进入 simple_demo 代码目录
cd /tps-future/ta-vsp/ta-samples/mot/simple_demo
  1. 创建并进入 build 目录
mkdir build && cd build
  1. 使用 cmake 配置工程
cmake .. && make

以上示例均在 Docker 开发环境中编译,并将生成的可执行程序通过 scp 拷贝到目标板运行。

4.1 AVFrame 到 OpenCV Mat 转换示例 (avframe_to_mat)

taOpenCV 图像处理 sample 集合,演示 taOpenCV 库的各项功能。在执行 sample 前,请先确认各项输入参数是否正确。另外 /data 目录下存放了测试数据,可以自行替换测试数据。 演示如何将 FFmpeg 解码得到的 AVFrame 转换为 OpenCV 的 cv::Mat 格式。

输入说明:

  • H264/HEVC 视频:使用 h264_taco/hevc_taco 硬件解码为 NV12

由 AVFrame 构造的 Mat 对象获取 AVFrame 数据,并存储为二进制文件。

taopencv_sample_avframe_to_mat <input_file>
参数说明
input_file输入视频流(MP4)
./taopencv_sample_avframe_to_mat output.mp4

4.2 Tacv 图像拷贝示例 (copy_to)

展示如何将图像数据拷贝到另一张图像的指定位置。

输入说明:

  • JPEG 图片:使用 ta_cv_image_jpeg_dec 硬件解码为 NV12
  • H264/HEVC 视频:使用 h264_taco/hevc_taco 硬件解码为 NV12
tacv_sample_copy_to <input_file> dst_w dst_h crop_to_stx crop_to_sty <output_file>
参数说明
input_file输入图片或视频文件
dst_w / dst_h目标画布尺寸
crop_to_stx / crop_to_sty复制起始坐标
output_file输出 JPEG 文件路径
./tacv_sample_copy_to output.mp4 1280 720 100 50 copy_to_out.jpg

4.3 视频解码示例 (decode)

  1. 在 docker 中,进入 decode 目录,输入 make 开始编译,即可获得板端可执行程序 decoder_sample:
cd  ta-vsp/ta-samples/decode
mkdir build && cd build
cmake .. && make
  1. 通过 scp 命令将程序发送到板端的 /usr/data/vdec 目录下:
scp -r decoder_sample root@192.168.56.171:/usr/data/vdec # IP 地址按照实际情况更改
  1. 登录到板端的 /usr/data/vdec 目录,目录下有一个视频文件 input.mp4,它用于测试解码功能:
./decoder_sample -i input.mp4 -c h264

解码器会输出如下日志,表明解码成功并显示性能:

[h264_taco @ 0x3e200] codec = H264, width:640, height:640
2026-04-22 10:54:16 [INFO][taffmpeg] Decoding completed successfully
2026-04-22 10:54:16 [INFO][taffmpeg] Resolution: 640x640, Output format: nv12
2026-04-22 10:54:16 [INFO][taffmpeg] Decoding performance: 941.18 fps
  1. 解码完成后,会在当前目录下生成 result.yuv 文件,它包含一组分辨率为 640x640NV12 视频帧。

  2. result.yuv 拷回主机,用 ffmpeg 提供的 ffplay 工具进行播放,观察图像正确性。播放命令为:

ffplay -video_size 640x640 -pixel_format nv12  -i result.yuv

4.4 视频编码示例 (encode)

  1. 在 docker 中,进入 encode 目录,输入 make 开始编译,即可获得板端可执行程序 encoder_sample:
cd  ta-vsp/ta-samples/encode
mkdir build && cd build
cmake .. && make
  1. 通过 scp 命令将程序发送到板端的 /usr/data/venc 目录下:
scp -r encoder_sample root@192.168.56.171:/usr/data/venc # IP 地址按照实际情况更改
  1. 登录到板端的 /usr/data/venc 目录:
./encoder_sample -i 1920x1080_420p_10f.yuv -f yuv420p -w 1920 -h 1080 -s 1
  1. 编码停止后,会在当前目录下生成 1920x1080_420p_10f_yuv420p_result.h264 文件,它是 h264 格式的文件。从日志可看到编码性能约为 34.59 fps(实际帧率受文件长度影响,用长视频文件可测得更稳定值)。
2026-04-22 10:46:26 [INFO][taffmpeg] Encoding performance: 34.59 fps
  1. 将生成的 .h264 文件拷回主机,用 ffmpeg 提供的 ffplay 工具进行播放,观察图像正确性。播放命令为:
ffplay -f h264 1920x1080_420p_10f_yuv420p_result.h264

4.5 图像裁剪示例 (crop)

1. crop_tacv

输入说明:

  • JPEG 图片:使用解码为 NV12
  • H264/HEVC 视频:使用 h264_taco/hevc_taco 硬件解码为 NV12

裁剪图像指定区域,输出 JPEG。

tacv_sample_crop <input_file> <out_w> <out_h> <crop_x> <crop_y> <output_file>
参数说明
input_file输入图片(jpeg)
out_w / out_h裁剪输出尺寸
crop_x / crop_y裁剪起始坐标
output_file输出 JPEG 文件路径
./tacv_sample_crop dog_bike_car_640x640.jpg 320 320 50 50 crop_out.jpg

2. crop_taopencv

输入说明:

  • JPEG 图片:使用解码为 NV12
  • H264/HEVC 视频:使用 h264_taco/hevc_taco 硬件解码为 NV12

裁剪图像指定区域,输出 JPEG。

taopencv_sample_crop <input_file> <crop_w> <crop_h>
参数说明
input_file输入图片(jpeg)
crop_w / crop_h裁剪输出尺寸
./taopencv_sample_crop src_jpeg_1920x1080.jpg 1280 720
./taopencv_sample_crop output.mp4 640 360

4.6 裁剪+缩放+填充示例 (crop_and_resize_padding)

输入说明:

  • JPEG 图片:使用 ta_cv_image_jpeg_dec 硬件解码为 NV12
  • H264/HEVC 视频:使用 h264_taco/hevc_taco 硬件解码为 NV12

裁剪 + 缩放 + padding 转换,用 tacv 实现了 letterbox 算法。

tacv_sample_convert_padding <input_file> crop_to_stx crop_to_sty crop_w crop_h dst_w dst_h dst_fmt <output_file>
参数说明
input_file输入图片或视频文件
crop_to_stx / crop_to_sty裁剪起始坐标
crop_w / crop_h裁剪尺寸
dst_w / dst_h目标尺寸
dst_fmt目标格式(3=NV12, 10=RGB_PACKED, 11=BGR_PACKED)
output_file输出文件路径
./tacv_sample_convert_padding dog_bike_car_640x640.jpg 0 0 320 320  160 240 3 letterbox.jpg

4.7 色彩空间转换示例 (csc)

1. csc_tacv

输入说明:

  • JPEG 图片:使用 ta_cv_image_jpeg_dec 硬件解码为 NV12
  • H264/HEVC 视频:使用 h264_taco/hevc_taco 硬件解码为 NV12

展示了一个标准的前处理操作,crop ROI -> resize -> CSC 。

tacv_sample_csc <input_file> <out_w> <out_h> <crop_h> <crop_w> <output_file>
参数说明
input_file输入图片或视频文件
out_w / out_h输出尺寸
crop_w / crop_h裁剪尺寸
output_file输出 RGB bin 文件路径
./tacv_sample_csc output.mp4 128 128 224 224 csc_output.bin 

csc_output.bin 拷回主机,用 ffplay 工具进行播放,观察图像正确性。播放命令为:

ffplay csc_output.bin -f rawvideo -pixel_format rgb24 -video_size 128x128 

2. csc_taopencv

输入说明:

  • JPEG 图片:使用解码为 NV12
  • H264/HEVC 视频:使用 h264_taco/hevc_taco 硬件解码为 NV12

taopencv_sample_csc 图像颜色空间转换,输出 JPEG。

taopencv_sample_csc <input_file>
参数说明
input_file输入图片(jpeg)
./taopencv_sample_csc output.mp4
./taopencv_sample_csc src_jpeg_1920x1080.jpg

4.8 HDMI 输入输出示例 (hdmi_in_out)

演示 HDMI OUT 和 HDMI IN OUT 以及 tavo 九宫格处理功能。在执行 sample 前,请先确认各项输入参数是否正确。另外测试 HDMI OUT 需要额外在 /root/ 目录下需存放 video.nv12 测试数据,可以自行替换其他测试数据。

输入说明:

  • HDMI OUT: 需要 /root/video.nv12
  • HDMI IN OUT: 电脑hdmi口与小板的hdmi-in口连接,转接小板的usb-a口与dk设备的usb-a口连接,dk设备的rgb接口与转接小板的rgb接口用短排线连接,转接小板的hdmi-out与显示屏连接

裁剪图像指定区域,输出 JPEG。

hdmi <function>
参数说明
function测试输出或者输入输出
./hdmi out
./hdmi in-out

4.9 JPEG 编解码示例 ( jpeg_dec_enc )

1. jpeg_dec_enc_taopencv

输入说明:

  • JPEG 图片:使用解码为 NV12。

JPEG图像的解码及编码,输出 JPEG。

taopencv_sample_jpeg_dec_enc <input_file> 
参数说明
input_file输入图片(jpeg)
./taopencv_sample_jpeg_dec_enc src_jpeg_1920x1080.jpg

2. jpeg_dec_tacv

输入说明:

  • JPEG 图片:使用 ta_cv_image_jpeg_dec 硬件解码为 NV12
  • H264/HEVC 视频:使用 h264_taco/hevc_taco 硬件解码为 NV12

JPEG 硬件解码,输出二进制文件。

tacv_sample_jpeg_dec <jpeg_file> <width> <height> <output_file>
参数说明
jpeg_file输入 JPEG 文件
width / height图像尺寸
output_file输出 JPEG 文件路径
./tacv_sample_jpeg_dec dog_bike_car_640x640.jpg 640 640 output_dec.bin

output_dec.bin 拷回主机,用 ffplay 工具进行播放,观察图像正确性。播放命令为:

ffplay -f rawvideo -pixel_format nv12 -video_size 640x640 output_dec.bin

3. jpeg_enc_tacv

输入说明:

  • JPEG 图片:使用 ta_cv_image_jpeg_dec 硬件解码为 NV12
  • H264/HEVC 视频:使用 h264_taco/hevc_taco 硬件解码为 NV12

缩放图像,为了效果展示,保存成JPEG文件。

tacv_sample_jpeg_enc <input_file> <output_file>
参数说明
input_file输入图片或视频文件
output_file输出 JPEG 文件路径
./tacv_sample_jpeg_enc dog_bike_car_640x640.jpg jpeg_enc_output.jpg

4.10 OpenCV Mat 转 AVFrame 示例 (mat_to_avframe)

输入说明:

  • H264/HEVC 视频:使用 h264_taco/hevc_taco 硬件解码为 NV12。

由 AVFrame 构造的 Mat 对象,并进行格式转换操作。

taopencv_sample_mat_to_avframe <input_file>
参数说明
input_file输入视频流(MP4)
./taopencv_sample_mat_to_avframe output.mp4

load_avframe.nv12 拷回主机,用 ffplay 工具进行播放,观察图像正确性。播放命令为:

ffplay load_avframe.nv12 -f rawvideo -pixel_format nv12 -video_size 640x360

4.11 多目标跟踪示例 (mot)

属于 pipeline类型的 demo,其中包含解码、图像处理、模型处理、编码、后处理等模块。

  1. 在 docker 中,执行以下命令:
cd /tps-future/ta-vsp/ta-samples/mot/simple_demo
mkdir build && cd build
cmake .. && make
  1. 运行

执行完编译操作盒,可以获得可执行文件 simple_demo 。在板端运行还需要准备模型文件、config 文件以及数据文件,我们可以通过 scp 命令将文件拷贝到板端。 运行命令:

./simple_demo config.json

注意:

  • config.json 为配置文件,请根据实际情况进行修改。
  • conifg.json 中的模型文件路径或者数据文件路径为板端的路径,请根据实际情况进行修改。
  • 通过修改 config.json 可以设置 opencv 解码或者 ffmpeg 解码
  • 修改 config.json 中的 output 字段可以保存输出视频为 mp4 文件

4.12 图像缩放示例 ( resize )

1. resize_tacv

缩放图像,为了效果展示,保存成 JPEG 文件。

tacv_sample_resize <input_file> <out_w> <out_h> <output_file>
参数说明
input_file输入图片或视频文件
out_w / out_h缩放输出尺寸
output_file输出 JPEG 文件路径
./tacv_sample_resize dog_bike_car_640x640.jpg 320 320 resize_output.jpg

2. resize_taopencv

图像缩小,输出 JPEG。

taopencv_sample_resize <input_file> <out_width> <out_height>
参数说明
input_file输入图片(jpeg)
out_width / out_heightresize 输出尺寸
./taopencv_sample_resize src_jpeg_1920x1080.jpg 360 640 
./taopencv_sample_resize output.mp4 360 640

4.13 图像拼接示例 (stitch)

实现四宫格 sample,注意这里是采取了一个输入复制了多份,然后拼接到目标画布,NV12 输出为 JPEG,并将效果图编码成了 JPEG 文件。

tacv_sample_stitch <input_file> <output_file>
参数说明
input_file输入图片或视频文件
output_file输出文件路径
./tacv_sample_stitch dog_bike_car_640x640.jpg stitch_out.jpg

五、Model Zoo

5.1 Model Zoo 简介

Model Zoo 是特普斯微官方提供的一系列预训练、预优化的高性能 AI 模型集合,专为 EA65 系列 AI SoC 设计。它旨在帮助开发者最大限度地缩短开发周期,并确保在硬件上获得最佳性能。

每个模型包通常包含:

  • 预优化模型文件: 直接在 NPU 上运行的 .nb 格式量化模型。
  • 端到端示例代码: 覆盖模型从数据读入到后处理全过程的例程。
  • 自定义转换工具: 支持使用自有数据集进行模型量化或微调。
  • 性能与精度报告: 提供在目标硬件上的实测数据供开发者评估。

5.2 Model Zoo 运行示例

本例程基于官方 YOLO11 模型,经过优化和适配,可在 EM20-DK 硬件平台上高效运行,用于实现对 80 种常见物体的实时检测。本例程提供的预编译模型为 INT8 量化模型(.nb 格式),旨在平衡检测精度与推理速度。项目代码通过 taRuntime 加载并执行 .nb 模型,利用 OpenCV 进行图像的预处理和后处理。

5.2.1 测试环境准备

准备一台 PC 作为 host 机,并配备 Ubuntu 系统和 Python 环境。EM20-DK 平台作为 device 机,已预装 Ubuntu 系统和 SDK。

访问 Model Zoo 官方 GiteeModel Zoo 官方 Github,下载官方提供的算法示例。

以 YOLO11 模型为例,通过运行 samples/YOLO11_det/scripts/ 目录下的 download.sh 脚本,获取例程所需的模型、数据与脚本等内容。

chmod +x download.sh && ./download.sh

下载内容:

models/
├── datasets.txt
├── yolo11s_float16.nb
├── yolo11s.onnx
├── yolo11s_int8.nb
├── yolo11s_config_fp16.json
└── yolo11s_config_int8.json
test_images/ # 测试用图片
├── input1.jpg
├── input2.jpg
├── input3.jpg
├── input4.jpg
└── input5.jpg
datasets/
├── val2017_1000 # coco val2017中随机抽取的1000张样本
└── instances_val2017_1000.json # coco val2017中随机抽取的1000张样本对应的标注信息

通过 TACO SDK 搭建交叉编译环境,使用交叉编译工具链编译生成可执行文件 yolo11s_det_soc:

cd cpp
mkdir build && cd build
cmake ..
make

在 EM20-DK 板端新建模型文件夹 yolo11,并通过 scp 命令将数据从 host 机复制到该目录下,复制完成后 yolo11 目录结构如下:


yolo11
├── test_images # 测试集图片
│ ├── input1.jpg
├── models
│ └── yolo11s_int8.nb # .nb 模型
| └── yolo11s_float16.nb
└── yolo11s_det_soc # 例程程序

5.2.2 单图推理

YOLO11s INT8 模型

在 yolo11 目录下运行 INT8 模型:

root@em20-dk:~/yolo11# ./yolo11s_det_soc --input=test_images/input1.jpg --model=models/yolo11s_int8.nb
--------------------------------------
Single Image Inference Mode
Model: models/yolo11s_int8.nb
Input: test_images/input1.jpg
Output: output.jpg
Conf thresh: 0.25
NMS thresh: 0.45
--------------------------------------
Input num: 1, Output num: 3
--------------------------------------------------------------
Tensor Attribute index: | 0
dim_count: | 4
dim_size: | [640, 640, 3, 1]
data_format: | 3
quant_format: | 2
quant_data (dfp):
fixed_point_pos: | 998277230
quant_data (affine):
tf_scale: | 0.003922
tf_zero_point: | -128
name: | uid_30000_out_0
--------------------------------------------------------------
--------------------------------------------------------------
Tensor Attribute index: | 0
dim_count: | 3
dim_size: | [6400, 144, 1]
data_format: | 3
quant_format: | 2
quant_data (dfp):
fixed_point_pos: | 1044353412
quant_data (affine):
tf_scale: | 0.187079
tf_zero_point: | 23
name: | uid_30001_out_0
--------------------------------------------------------------
--------------------------------------------------------------
Tensor Attribute index: | 1
dim_count: | 3
dim_size: | [1600, 144, 1]
data_format: | 3
quant_format: | 2
quant_data (dfp):
fixed_point_pos: | 1048615530
quant_data (affine):
tf_scale: | 0.251178
tf_zero_point: | 66
name: | uid_30002_out_0
--------------------------------------------------------------
--------------------------------------------------------------
Tensor Attribute index: | 2
dim_count: | 3
dim_size: | [400, 144, 1]
data_format: | 3
quant_format: | 2
quant_data (dfp):
fixed_point_pos: | 1046139268
quant_data (affine):
tf_scale: | 0.213691
tf_zero_point: | 70
name: | uid_30003_out_0
--------------------------------------------------------------
Model initialized successfully
--------------------------------------
Detected 16 objects

===== Time Statistics =====
Image read time: 113.72 ms
Preprocess time: 89.49 ms
Inference time: 15.48 ms
Postprocess time: 57.66 ms
Total time: 276.36 ms
============================
Output saved to: output.jpg
--------------------------------------
Model deinitialized

输出日志解析

  • 使用模型:models/yolo11s_int8.nb
  • 输入图像:test_images/input1.jpg(input1.jpg 可换成自定义 jpg 文件)
  • 输出图像:output.jpg
  • 输入图像的尺寸:640x640 像素(预处理后)
  • 性能统计:
    • 读图+解码: 113.72 ms,占比 44.19%
    • 预处理:89.49 ms,占比 33.05%
    • npu推理:15.48 ms,占比 5.07%
    • 后处理:57.66 ms,占比 20.05%
    • 总耗时:276.36 ms
  • 检测结果:共 16 个对象,置信度 ≥ 0.25
  • Inference FPS:≈ 64.6 fps(1000/15.48)
  • 端到端 FPS:≈ 3.6 fps(1000/276)
  • 状态:PASS

生成结果

YOLO11s FP16 模型

在 yolo11 目录下运行 FP16 模型:

root@em20-dk:~/yolo11# ./yolo11s_det_soc --input=test_images/input1.jpg --model=models/yolo11s_float16.nb
--------------------------------------
Single Image Inference Mode
Model: models/yolo11s_float16.nb
Input: test_images/input1.jpg
Output: output.jpg
Conf thresh: 0.25
NMS thresh: 0.45
--------------------------------------
Input num: 1, Output num: 3
--------------------------------------------------------------
Tensor Attribute index: | 0
dim_count: | 4
dim_size: | [640, 640, 3, 1]
data_format: | 1
quant_format: | 0
quant_data (dfp):
fixed_point_pos: | 0
quant_data (affine):
tf_scale: | 0.000000
tf_zero_point: | 0
name: | input/output[0]
--------------------------------------------------------------
--------------------------------------------------------------
Tensor Attribute index: | 0
dim_count: | 3
dim_size: | [6400, 144, 1]
data_format: | 1
quant_format: | 0
quant_data (dfp):
fixed_point_pos: | 0
quant_data (affine):
tf_scale: | 0.000000
tf_zero_point: | 0
name: | uid_5_out_0
--------------------------------------------------------------
--------------------------------------------------------------
Tensor Attribute index: | 1
dim_count: | 3
dim_size: | [1600, 144, 1]
data_format: | 1
quant_format: | 0
quant_data (dfp):
fixed_point_pos: | 0
quant_data (affine):
tf_scale: | 0.000000
tf_zero_point: | 0
name: | uid_4_out_0
--------------------------------------------------------------
--------------------------------------------------------------
Tensor Attribute index: | 2
dim_count: | 3
dim_size: | [400, 144, 1]
data_format: | 1
quant_format: | 0
quant_data (dfp):
fixed_point_pos: | 0
quant_data (affine):
tf_scale: | 0.000000
tf_zero_point: | 0
name: | uid_3_out_0
--------------------------------------------------------------
Model initialized successfully
--------------------------------------
Detected 16 objects

===== Time Statistics =====
Image read time: 90.98 ms
Preprocess time: 44.19 ms
Inference time: 24.61 ms
Postprocess time: 51.13 ms
Total time: 210.91 ms
============================
Output saved to: output.jpg
--------------------------------------
Model deinitialized

输出日志解析

  • 使用模型:models/yolo11_float16.nb
  • 输入图像:test_images/input1.jpg(input1.jpg 可换成自定义 jpg 文件)
  • 输出图像:output.jpg
  • 输入图像的尺寸:640x640 像素 (预处理缩放后)
  • 性能统计:
    • 读图+解码:90.98 ms,占比 44.19%
    • 预处理:44.19 ms,占比 44.19%
    • npu推理:24.61 ms,占比 24.61%
    • 后处理:51.13 ms,占比 51.13%
    • 总耗时:210.91 ms
  • 检测结果:共 16 个对象(置信度 ≥ 0.25)
  • Inference FPS:≈ 40.7 fps(1000/24.61)
  • 端到端FPS:≈ 40.7 fps
  • 状态:pass

生成结果

5.2.3 模型性能评测

基于单图推理测试结果,我们进行了性能对比分析:

性能对比表格
模型名称输入图像输出图像读码解码时间(ms)预处理时间(ms)NPU推理时间(ms)后处理时间(ms)总耗时(ms)推理FPS端到端FPS
YOLO11s INT8input1.jpgoutput.jpg113.7289.4915.4857.66276.3664.63.6
YOLO11s FP16input1.jpgoutput.jpg90.9844.1924.6151.13210.9140.64.7
性能分析
  • NPU 推理性能:INT8 模型推理耗时仅 15.48 ms,相比 FP16 模型的 24.61 ms 提升了约 59%,INT8 量化在 NPU 上优势明显。
  • 端到端性能:尽管 INT8 推理更快,但整体端到端耗时(276.36 ms)反而高于 FP16(210.91 ms),主要原因是 INT8 版本在图像读码解码和预处理阶段耗时较多(合计 203.21 ms,占 73.5%)。这使得 FP16 的端到端 FPS(4.7 fps)反而高于 INT8(3.6 fps)。
  • 瓶颈定位:无论 INT8 还是 FP16,前后处理时间占总耗时的 80% 以上(INT8 为 88%,FP16 为 80%),说明当前 pipeline 的瓶颈在于图像读码、预处理和后处理阶段。后续优化应聚焦于 DMA-BUF 零拷贝、多线程流水线以及降低输入分辨率等方法,以进一步提升端到端性能。
结论
  • INT8 量化在 NPU 推理速度上具有显著优势(+59%),适合对单帧推理延迟敏感的应用。
  • 端到端整体性能受前后处理制约较大,FP16 模型因预处理时间更短而获得更高的整体帧率。
  • 后续工作需重点优化数据流 pipeline,以充分发挥 NPU 的算力潜力。

5.3 获取更多模型

Model Zoo 将持续扩充,涵盖更多 AI 应用领域,致力于提供“拿来即用”的 AI 模型解决方案,成为用户开发 AI 应用的强大助力。